#include"../../include/ClinetLoop.h"
#include<iostream>
#include<sstream>
#include<locale>
#include<ctype.h>
#include<nlohmann/json.hpp>
using json = nlohmann::json;
using namespace std;
/*
Linux 下颜色控制码：
\\033[30m 黑色
\\033[31m 红色
\\033[32m 绿色
\\033[33m 黄色
\\033[34m 蓝色
\\033[35m 洋红色
\\033[36m 青色
\\033[37m 白色
*/
ClinetLoop::ClinetLoop(const string &ip,unsigned short port)
:_client(ip,port),
_isLoop(false)
{

}

ClinetLoop::~ClinetLoop()
{

}

void ClinetLoop::start()
{
    _client.connect();
    _isLoop = true;
    loop();
}

void ClinetLoop::stop()
{
    _isLoop = false;
}

void ClinetLoop::loop()
{
    int input = 0;
    while(_isLoop)
    {
        cout<<"please select <0.exit 1.keyWord 2.webPage>"<<endl;

        cout<<_color.green;
        cout<<">> :";
        cin>>input;
        cout<<_color.isback;

        if(!cin)
        {
            cin.clear();
            cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            cout<<"input error,please again!"<<endl;
            continue;
        }

        cin.ignore();

        switch(input)
        {
            case 0:
            {
                cout<<"bye!"<<endl;
                stop();
                break;
            }
            case 1:
            {
                string data;
                cout<<"please input keyWord:"<<endl;
                cout<<_color.green<<">> :";
                getline(std::cin,data);

                cout<<_color.isback;
                keyWord(data);
                break;
            }
            case 2:
            {
                string data;
                cout<<"please input page"<<endl;
                cout<<_color.green<<">> :";
                getline(std::cin,data);
                cout<<_color.isback;
                webPage(data);
                break;
            }
            default:{
                cout<<"input error,please again"<<endl;
                continue;
            }
        }
    }
}

void ClinetLoop::getKey(string &key)
{
    locale loc;
    for(auto it = key.begin();it!=key.end();)
    {
        if(ispunct(*it,loc))
        {
            key.erase(it);
        }
        else{
            if(isupper(*it)) {
                *it = tolower(*it);
            }
            ++it;
        }
    }
}

void ClinetLoop::keyWord(string &word)
{
    stringstream ss;
    ss<<word;
    string msg;
    while(ss>>msg)
    {
        getKey(msg);
        cout<<_color.green<<">> ["<<msg<<"]"<<_color.isback<<endl;
        if(msg.size() == 0)
        {
            continue;
        }
        _client.sendMsg(msg,1);
        if(_client.isConnection() == false)
        {
            cout<<_color.red;
            cout<<"connection is close"<<_color.isback<<endl;
            stop();
            break;
        }
        string newMsg = _client.recvMsg();
        if(_client.isConnection() == false)
        {
            cout<<_color.red;
            cout<<"connection is close"<<_color.isback<<endl;
            stop();
            break;
        }
        json j = json::parse(newMsg);
        vector<string> rres = j.get<std::vector<string>>();
        
        cout<<_color.blue;
        
        cout<<">> server:"<<endl;
        if(rres.size() == 1)
        {
            cout<<rres[0]<<endl;
        }
        else{
            cout<<"----------------"<<endl;
            for(auto s:rres)
            {
                cout<<"| "<<s<<endl;
            }
        }
        cout<<_color.isback;
        //cout<<">> server:"<<newMsg<<_color.isback<<endl;
    }
}

void ClinetLoop::webPage(string &msg)
{
     getKey(msg);
    cout<<_color.green<<">> ["<<msg<<"]"<<_color.isback<<endl;
    if(msg.size() == 0)
    {
        return ;
    }
    _client.sendMsg(msg,2);
    
    if(_client.isConnection() == false)
    {
        cout<<_color.red;
        cout<<"connection is close"<<_color.isback<<endl;
        stop();
        return ;
    }
        
    string newMsg = _client.recvMsg();
    if(_client.isConnection() == false)
    {
        cout<<_color.red;
        cout<<"connection is close"<<_color.isback<<endl;
        stop();
        return ;
    }
    json j = json::parse(newMsg);
    vector<string> rres = j.get<std::vector<string>>();
        
    cout<<_color.yellow;
        
    cout<<">> server:"<<endl;
    if(rres.size() == 1)
    {
        cout<<rres[0]<<endl;
    }
    else{
        int nu = 0;
        int sz = 0;

        while(nu<rres.size())
        {
            sz+=5;

            for(;nu<rres.size() && nu<sz;nu++)
            {
                cout<<rres[nu]<<endl;
            }
            char ch ;

            cout<<"输入 n 翻页,q 退出:"<<endl;

            do{
                cin>>ch;
            }while(ch!='n'&&ch!='q');
            
            //cout<<"["<<ch<<"]"<<endl;
            
            if(ch == 'q')
            {
                break;
            }

            //cout<<nu<<" : "<<sz<<endl;
        }
    }
    cout<<_color.isback;
    //cout<<">> server:"<<newMsg<<_color.isback<<endl;
    
}
 